( function () {
class StereoEffect {
  constructor(renderer) {
    const _stereo = new THREE.StereoCamera();

    _stereo.aspect = 0.5;
    const size = new THREE.Vector2();

    this.setEyeSeparation = function (eyeSep) {
      _stereo.eyeSep = eyeSep;
    };

    this.setSize = function (width, height) {
      renderer.setSize(width, height);
    };

    this.render = function (scene, camera) {
      scene.updateMatrixWorld();
      if (camera.parent === null) camera.updateMatrixWorld();

      _stereo.update(camera);

      renderer.getSize(size);
      if (renderer.autoClear) renderer.clear();
      renderer.setScissorTest(true);
      renderer.setScissor(0, 0, size.width / 2, size.height);
      renderer.setViewport(0, 0, size.width / 2, size.height);
      renderer.render(scene, _stereo.cameraL);
      renderer.setScissor(size.width / 2, 0, size.width / 2, size.height);
      renderer.setViewport(size.width / 2, 0, size.width / 2, size.height);
      renderer.render(scene, _stereo.cameraR);
      renderer.setScissorTest(false);
    };
  }

}

THREE.StereoEffect = StereoEffect;
} )();
